package com.star.percalservice.utils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class R extends HashMap<String, Object> {

    private static final long serialVersionUID = 1L;

    // 默认成功状态码
    private static final int SUCCESS_CODE = 200;
    // 默认失败状态码
    private static final int FAIL_CODE = 500;

    // 默认成功消息
    private static final String SUCCESS_MSG = "success";
    // 默认失败消息
    private static final String FAIL_MSG = "fail";

    public R() {
        put("code", SUCCESS_CODE);
        put("msg", SUCCESS_MSG);
    }

    /**
     * 成功返回，无参数
     *
     * @return R 对象
     */
    public static R ok() {
        return new R();
    }

    /**
     * 成功返回，带消息
     *
     * @param msg 消息
     * @return R 对象
     */
    public static R ok(String msg) {
        R r = new R();
        r.put("msg", msg);
        return r;
    }

    /**
     * 成功返回，带数据
     *
     * @param map 数据
     * @return R 对象
     */
    public static R ok(Map<String, Object> map) {
        R r = new R();
        r.put("data", map);
        return r;
    }

    /**
     * 成功返回，带消息和状态码
     *
     * @param msg  消息
     * @param code 状态码
     * @return R 对象
     */
    public static R ok(String msg, int code) {
        R r = new R();
        r.put("msg", msg);
        r.put("code", code);
        return r;
    }

    /**
     * 成功返回，带消息和数据
     *
     * @param msg  消息
     * @param data 数据
     * @return R 对象
     */
    public static R ok(String msg, Map<String, Object> data) {
        R r = new R();
        r.put("msg", msg);
        r.put("data", data);
        return r;
    }


    /**
     * 成功返回，带消息、状态码和数据
     *
     * @param msg  消息
     * @param code 状态码
     * @param data 数据
     * @return R 对象
     */
    public static R ok(String msg, int code, Map<String, Object> data) {
        R r = new R();
        r.put("msg", msg);
        r.put("code", code);
        r.put("data", data);
        return r;
    }

    /**
     * 成功返回，带消息和数据
     *
     * @param msg  消息
     * @param data 数据
     * @return R 对象
     */
    public static R ok(String msg, List<?> data) {
        R r = new R();
        r.put("msg", msg);
        r.put("data", data);
        return r;
    }

    /**
     * 成功返回，带消息、状态码和数据
     *
     * @param msg  消息
     * @param code 状态码
     * @param data 数据
     * @return R 对象
     */
    public static R ok(String msg, int code, List<?> data) {
        R r = new R();
        r.put("msg", msg);
        r.put("code", code);
        r.put("data", data);
        return r;
    }

    /**
     * 失败返回，无参数
     *
     * @return R 对象
     */
    public static R error() {
        R r = new R();
        r.put("code", FAIL_CODE);
        r.put("msg", FAIL_MSG);
        return r;
    }

    /**
     * 失败返回，带消息
     *
     * @param msg 消息
     * @return R 对象
     */
    public static R error(String msg) {
        R r = new R();
        r.put("code", FAIL_CODE);
        r.put("msg", msg);
        return r;
    }

    /**
     * 失败返回，带消息和状态码
     *
     * @param msg  消息
     * @param code 状态码
     * @return R 对象
     */
    public static R error(String msg, int code) {
        R r = new R();
        r.put("code", code);
        r.put("msg", msg);
        return r;
    }

    /**
     * 失败返回，带消息和数据
     *
     * @param msg  消息
     * @param data 数据
     * @return R 对象
     */
    public static R error(String msg, Map<String, Object> data) {
        R r = new R();
        r.put("code", FAIL_CODE);
        r.put("msg", msg);
        r.put("data", data);
        return r;
    }

    /**
     * 失败返回，带消息、状态码和数据
     *
     * @param msg  消息
     * @param code 状态码
     * @param data 数据
     * @return R 对象
     */
    public static R error(String msg, int code, Map<String, Object> data) {
        R r = new R();
        r.put("code", code);
        r.put("msg", msg);
        r.put("data", data);
        return r;
    }

    /**
     * 失败返回，带消息和数据
     *
     * @param msg  消息
     * @param data 数据
     * @return R 对象
     */
    public static R error(String msg, List<?> data) {
        R r = new R();
        r.put("code", FAIL_CODE);
        r.put("msg", msg);
        r.put("data", data);
        return r;
    }

    /**
     * 失败返回，带消息、状态码和数据
     *
     * @param msg  消息
     * @param code 状态码
     * @param data 数据
     * @return R 对象
     */
    public static R error(String msg, int code, List<?> data) {
        R r = new R();
        r.put("code", code);
        r.put("msg", msg);
        r.put("data", data);
        return r;
    }

}
